//
//  OYCUserViewModel.swift
//  WeiBo-Swift
//
//  Created by daniel on 2017/8/7.
//  Copyright © 2017年 daniel. All rights reserved.
//

import Foundation

class OYCUserViewModel {
    
    static let shared = {
        return OYCUserViewModel()
    }()
    
    /// 用户模型
    var account: OYCUserAccount?
    
    var accountPath: String {
        
        let directoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
        return "\(directoryPath!)/userAccount.plist"
    }
    
    /// 返回有效的 token
    var accessToken: String? {
        
        // 如果 token 没有过期，返回 account.中的 token 属性
        if !isExpired {
            return account?.access_token
        }
        return nil
    }
    
    /// 用户登录标记
    var userLogon: Bool {
        
        // 1. 如果 token 有值，说明登录成功
        // 2. 如果没有过期，说明登录有效
        return account?.access_token != nil && !isExpired
    }
    
    /// 判断账户是否过期
    private var isExpired: Bool {
        
        // 判断用户账户过期日期与当前系统日期`进行比较`
        // 自己改写日期，测试逻辑是否正确，创建日期的时候，如果给定 负数，返回比当前时间早的日期
        // account?.expiresDate = NSDate(timeIntervalSinceNow: -3600)
        
        // 如果 account 为 nil，不会调用后面的属性，后面的比较也不会继续...
        if account?.expires_date?.compare(NSDate() as Date) == ComparisonResult.orderedDescending {
            // 代码执行到此，一定进行过比较！
            return false
        }
        
        // 如果过期返回 true
        return true
    }
    
    init() {
        
        // 从沙盒解档数据，恢复当前数据 - 磁盘读写的速度最慢，不如内存读写效率高！
        account = NSKeyedUnarchiver.unarchiveObject(withFile: accountPath) as? OYCUserAccount
        
        // 判断token是否过期
        if isExpired {
            print("已经过期")
            
            // 如果过期，清空解档的数据
            account = nil
        }

        
    }
    
    func loadAccessToken(code: String, isSuccess: @escaping (Bool) -> Void) {
        
        OYCNetManager.sharedTools.loadAccessToken(code: code) { (result, error) in
            if error != nil {
                isSuccess(false)
                return
            }
            
            guard ((result as? [String : Any]) != nil) else {
                
                return
            }
            
            let ret = result as! [String : Any]
            
            let user = OYCUserAccount(dic: ret)
//            user.expires_in = ret["expires_in"] as! TimeInterval
            OYCUserViewModel.shared.account = user
            
            self.loadUserInfo(uid: user.uid!, finished: { (result, error) in
                if error == nil{
                    user.screen_name = (result!)["screen_name"] as? String
                    user.avatar_large = (result!)["avatar_large"] as? String
                    
                    NSKeyedArchiver.archiveRootObject(user, toFile: OYCUserViewModel.shared.accountPath)
                    
                    isSuccess(true)
                    return
                }
                isSuccess(false)
            })
            
        }
        
    }
    
    func loadUserInfo(uid: String, finished: @escaping ([String : Any?]?, Error?) -> Void) {
        OYCNetManager.sharedTools.loadUserInfo(uid: uid, finished: { (result, error) in
            if error != nil{
                finished(nil,error)
            }
            
            let ret = result as? [String : Any]
            
            if ret == nil {
                finished(nil,error)
                return
            }
            
            finished(ret, nil)
        
        })
    }
    
}
